package logica;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Estadisticas implements Serializable {

	private static final long serialVersionUID = 8797777250457292578L;

	// Jugadores almacenados:
	private HashMap<String, Partidas> m_puntos;
	private List<String> m_ultimos;

	// Jugadores recien ingresados:
	private String m_jugadorActual;
	private Partidas m_partidaActual;

	/** Construye estadisticas vacias. */
	public Estadisticas() {
		m_puntos = new HashMap<String, Partidas>();
		m_ultimos = new ArrayList<String>();
		m_partidaActual = new Partidas();
	}

	/** Construye estadisticas a partir de otra. */
	public Estadisticas(Estadisticas otra) {
		this();
		if (otra != null) {
			if (otra.m_puntos != null)
				m_puntos = otra.m_puntos;
			if (otra.m_ultimos != null)
				m_ultimos = otra.m_ultimos;
		}

	}

	/** Ingresa un jugador por el nombre y genera un punto por jugada. */
	public void asignarJugador(String nombre) {
		if (nombre != null) {
			m_jugadorActual = nombre;
			m_partidaActual = new Partidas();
			m_partidaActual.nueva();
		}
	}

	/** Suma los datos del jugador nuevo con los ya almacenados. */
	private void cargarPuntos() {
		if (!jugadorConocido()) {
			m_puntos.put(m_jugadorActual, new Partidas());
		}
		m_puntos.get(m_jugadorActual).sumar(m_partidaActual);
	}

	/** Comprueba si el jugador esta en ente los almacenados. */
	private boolean jugadorConocido() {
		if (m_puntos.containsKey(m_jugadorActual))
			return true;
		return false;
	}

	/** Suma un punto ganado y guarda el jugador junto con el resto. */
	public void partidaGanada() {
		if (m_jugadorActual == null)
			return;

		m_partidaActual.nuevaGanada();
		if (!jugadorConocido())
			m_ultimos.add(0, m_jugadorActual);

		cargarPuntos();

		int size = m_ultimos.size();
		if (size > 14)
			m_ultimos.remove(size - 1);

	}
	
	/** Suma un punto perdido y guarda el jugador junto con el resto. */
	public void partidaPerdida() {
		if (m_jugadorActual == null)
			return;
		if (!jugadorConocido())
			m_ultimos.add(0, m_jugadorActual);

		cargarPuntos();

		int size = m_ultimos.size();
		if (size > 14)
			m_ultimos.remove(size - 1);

	}

	/** Devuelve el tamaño de la lista de los ganadores. */
	public Integer size() {
		return m_ultimos.size();
	}

	
	private boolean fueraDeRango(int i) {
		return !(i >= 0 && i < m_ultimos.size());
	}

	/** Devuelve el nombre del i ganador. */
	public String getNombre(int i) {
		return (fueraDeRango(i)) ? null : m_ultimos.get(i);
	}

	/** Devuelve las jugadas del i ganador. */
	public Integer getPartidasJugadas(int i) {
		return (fueraDeRango(i)) ? null : m_puntos.get(m_ultimos.get(i))
				.getJugadas();
	}

	/** Devuelve las ganadas del i ganador. */
	public Integer getPartidasGanadas(int i) {
		return (fueraDeRango(i)) ? null : m_puntos.get(m_ultimos.get(i))
				.getGanadas();
	}

	@Override
	public String toString() {
		return "Estadisticas [m_puntos=" + m_puntos + ", m_ultimos="
				+ m_ultimos + ", m_jugadorActual=" + m_jugadorActual
				+ ", m_partidaActual=" + m_partidaActual + "]";
	}

}
